package leetcode.year2021.month12;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

// 17. 电话号码的字母组合
public class _03_6LetterCombinations17 {
  /**
   *  思路： 使用回溯的方法求取结果， 每个数字中的元素都出现一遍，出现完丢掉，遍历到下一层
   * @param digits
   * @return
   */
  public List<String> letterCombinations(String digits) {
    HashMap<Character, String> phoneMap = new HashMap<>();
    phoneMap.put('2', "abc");
    phoneMap.put('3', "def");
    phoneMap.put('4', "ghi");
    phoneMap.put('5', "jkl");
    phoneMap.put('6', "mno");
    phoneMap.put('7', "pqrs");
    phoneMap.put('8', "tuv");
    phoneMap.put('9', "wxyz");

    List<String> result = new ArrayList<>();

    StringBuffer tempString = new StringBuffer();

    getCombinByDfs(digits,0,phoneMap,tempString,result);

    return result;
  }

  private void getCombinByDfs(String digits, int index, HashMap<Character, String> phoneMap, StringBuffer tempString, List<String> result) {
    if (index == digits.length()){
      result.add(tempString.toString());
      return;
    }
    String currStrs = phoneMap.get(digits.charAt(index));
    for (int i = 0; i < currStrs.length(); i++) {
      tempString.append(currStrs.charAt(i));
      getCombinByDfs(digits,index+1,phoneMap,tempString,result);
      tempString.deleteCharAt(index);
    }
  }


  /**
   * 17. 电话号码的字母组合
   * 给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
   *
   * 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。
   *
   * 示例 1：
   *
   * 输入：digits = "23"
   * 输出：["ad","ae","af","bd","be","bf","cd","ce","cf"]
   * 示例 2：
   *
   * 输入：digits = ""
   * 输出：[]
   * 示例 3：
   *
   * 输入：digits = "2"
   * 输出：["a","b","c"]
   *
   *
   * 提示：
   *
   * 0 <= digits.length <= 4
   * digits[i] 是范围 ['2', '9'] 的一个数字。
   */
}
